package com.sxkf.template.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.jeecg.common.exception.SxkfException;
import org.jeecg.common.exception.SxkfExceptionEnum;
import org.jeecg.common.util.CheckEmptyUtil;
import com.sxkf.template.entity.Store;
import com.sxkf.template.mapper.StoreMapper;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.sxkf.template.entity.FollowStore;
import com.sxkf.template.mapper.FollowStoreMapper;
import com.sxkf.template.service.FollowStoreService;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;

@Service
public class FollowStoreServiceImpl extends ServiceImpl<FollowStoreMapper, FollowStore> implements FollowStoreService{

    @Resource
    private FollowStoreMapper followStoreMapper;

    @Resource
    private StoreMapper storeMapper;

    @Override
    public IPage<Store> getFollowStoreList(String userId, String storeName, String orderType, Integer pageNo, Integer pageSize) {
        if (CheckEmptyUtil.isEmpty(userId)) {
            throw new SxkfException(SxkfExceptionEnum.PARAM_ERROR);
        }
        // 校验页码和页面大小是否合法，避免不合理的请求
        if (pageNo <= 0 || pageSize <= 0) {
            throw new SxkfException(SxkfExceptionEnum.PARAM_ERROR);
        }
        Page<Store> page = new Page<>(pageNo, pageSize);

        // 1. 查询 FollowStore 表，获取所有关注记录对应的用户 ID
        LambdaQueryWrapper<FollowStore> followQueryWrapper = new LambdaQueryWrapper<FollowStore>()
                .select(FollowStore::getStoreId)
                .eq(FollowStore::getUserId, userId);  // 你可以根据需要进行过滤
        if ("3".equals(orderType)) {
            // 按照关注时间升序排序
            followQueryWrapper.orderByAsc(FollowStore::getFollowTime);
        } else if ("2".equals(orderType)) {
            // 按照关注时间降序排序
            followQueryWrapper.orderByDesc(FollowStore::getFollowTime);
        } else {
            // 默认情况下按关注时间降序排序
            followQueryWrapper.orderByDesc(FollowStore::getFollowTime);
        }

        List<String> followStoreIds = followStoreMapper.selectList(followQueryWrapper).stream()
                .map(FollowStore::getStoreId) // 获取被关注者的 userId
                .collect(Collectors.toList());

        // 2. 根据这些 userIds 查询 Users 表
        if (!followStoreIds.isEmpty()) {
            return storeMapper.selectPage(page, new LambdaQueryWrapper<Store>()
                    .in(Store::getId, followStoreIds));
        }
        return null;
    }


    @Override
    public IPage<Store> likeQueryStore(String userId, String storeName, String orderType, Integer pageNo, Integer pageSize) {
        if (CheckEmptyUtil.isEmpty(userId) || CheckEmptyUtil.isEmpty(storeName)) {
            throw new SxkfException(SxkfExceptionEnum.PARAM_ERROR);
        }
        // 校验页码和页面大小是否合法，避免不合理的请求
        if (pageNo <= 0 || pageSize <= 0) {
            throw new SxkfException(SxkfExceptionEnum.PARAM_ERROR);
        }
        Page<Store> page = new Page<>(pageNo, pageSize);

        // 1. 查询 FollowStore 表，获取所有关注记录对应的商铺ID
        LambdaQueryWrapper<FollowStore> followQueryWrapper = new LambdaQueryWrapper<FollowStore>()
                .select(FollowStore::getStoreId)
                .eq(FollowStore::getUserId, userId);  // 你可以根据需要进行过滤
        if ("3".equals(orderType)) {
            // 按照关注时间升序排序
            followQueryWrapper.orderByAsc(FollowStore::getFollowTime);
        } else if ("2".equals(orderType)) {
            // 按照关注时间降序排序
            followQueryWrapper.orderByDesc(FollowStore::getFollowTime);
        } else {
            // 默认情况下按关注时间降序排序
            followQueryWrapper.orderByDesc(FollowStore::getFollowTime);
        }

        List<String> storeIds = followStoreMapper.selectList(followQueryWrapper).stream()
                .map(FollowStore::getStoreId) // 获取被关注者的 userId
                .collect(Collectors.toList());

        // 2. 根据这些 userIds 查询 Users 表
        if (!storeIds.isEmpty()) {
            return storeMapper.selectPage(page, new LambdaQueryWrapper<Store>()
                    .in(Store::getId, storeIds)
                    .like(Store::getName,storeName));
        }
        return  null;
    }


    @Override
    @Transactional
    public Boolean createFollowStore(FollowStore followStore) {
        if (CheckEmptyUtil.isEmpty(followStore)) {
            throw new SxkfException(SxkfExceptionEnum.PARAM_ERROR);
        }
        followStore.setFollowTime(new Date());
        followStoreMapper.insert(followStore);

        //店铺的粉丝数量+1
        Store store = storeMapper.selectById(followStore.getStoreId());
        if (store!= null) {
            store.setFansCount(store.getFansCount() + 1);
            storeMapper.updateById(store);
            return true;
        }
        return false;
    }


    @Override
    @Transactional
    public Boolean cancelFollowStore(FollowStore followStore) {
        if (CheckEmptyUtil.isEmpty(followStore)) {
            throw new SxkfException(SxkfExceptionEnum.PARAM_ERROR);
        }
        followStoreMapper.updateById(followStore);

        //店铺的粉丝数量-1
        Store store = storeMapper.selectById(followStore.getStoreId());
        if (store!= null) {
            store.setFansCount(store.getFansCount() - 1);
            storeMapper.updateById(store);
            return true;
        }
        return false;
    }
}
